# extractor/jd_parser.py
# 解析职位描述job description

import os
import json
from openai import OpenAI
from django.conf import settings
from ..utils.file_parser import FileParser

# 从Django设置中获取API密钥
api_key = getattr(settings, 'XINGHUO_API_KEY', 'YOUR_API_KEY_HERE')

client = OpenAI(
    api_key=api_key,
    base_url="https://dashscope.aliyuncs.com/compatible-mode/v1"
)

class JDParser:
    def __init__(self, save_to_file: bool = False):
        self.extractor = FileParser()
        self.save_to_file = save_to_file

    def parse(self, filepath: str) -> dict:
        """
        从岗位描述文本中提取结构化JD信息。
        :param filepath: JD文件路径
        :return: dict格式结构化JD
        """
        if not os.path.exists(filepath):
            raise FileNotFoundError(f"文件未找到：{filepath}")

        filename = os.path.basename(filepath)
        name_without_ext = os.path.splitext(filename)[0]

        # 读取岗位描述内容
        raw_text = self.extractor.extract_text(filepath)

        # 调用大模型结构化解析
        structured_jd = self.extract_structured_jd(raw_text)

        return structured_jd

    def extract_structured_jd(self, jd_text: str) -> dict:
        """
        调用大模型提取JD结构化字段。
        """
        prompt = f"""你是一位资深招聘专家，请你从以下岗位描述中**提取并总结结构化信息**，以 JSON 格式输出，字段如下：

        {{
        "job_title": "岗位名称",
        "department": "所在部门",
        "required_hard_skills": ["列出应聘者需要掌握的技术、语言、工具等"],
        "required_soft_skills": ["列出应聘者应具备的沟通、抗压、学习能力等"],
        "experience_years": "推荐的工作经验年限",
        "education": "最低学历及专业要求",
        "language_requirements": ["语言能力，如英语能力等"],
        "other_requirements": "其他额外加分项或偏好"
        }}

        注意：
        - 如果岗位描述中没有明确写明某个字段，你可以根据常识或内容推测合理填写。
        - 请确保输出内容是**合法 JSON 格式本体**，不要加任何解释说明或 Markdown 标记。

        岗位描述如下：
        \"\"\"{jd_text}\"\"\"
        """

        try:
            completion = client.chat.completions.create(
                model="qwen-plus",
                messages=[
                    {"role": "system", "content": "你是一位专业的JD解析器"},
                    {"role": "user", "content": prompt}
                ],
                temperature=0.2
            )
            content = completion.choices[0].message.content.strip()

            # 去除Markdown代码块标记（```json 和 ```）
            if content.startswith("```json"):
                content = content[7:]  # 去掉 ```json
            if content.endswith("```"):
                content = content[:-3]

            # 再次strip清理空白字符
            content = content.strip()

            # 尝试解析
            return json.loads(content)

        except json.JSONDecodeError:
            print("JSON解析失败，请检查模型输出：")
            print(content)
            return {"error": "Invalid JSON", "raw_output": content}
        except Exception as e:
            return {"error": f"调用大模型失败: {str(e)}"} 